﻿//#undef 移除宏的操作
//#include<stdio.h>
//#define MAX(x,y) ((x)>(y)?(x):(y))
//int main()
//{
//	int a = 10, b = 20;
//	int c = MAX(a, b);
//	fprintf(stdout, "%d", c);
//#undef MAX//将宏全部移除，没有此宏了
//	int d = MAX(a, c);//会报错，因为宏已经被移除了
//	fprintf(stdout, "%d", d);
//	return 0;
//}

//条件编译#if和#endif
//#include<stdio.h>
//#define M 0
//int main()
//{
////当条件成立，即值为1时，执行下面的语句，若不成立，在预处理时代码就被删除了
//#if M == 1
////跟if条件语句不同的是，if语句每次执行时都有此代码，#if中是直接把代码删除
//	fprintf(stdout, "%d", M);
//#elif M == 2//多种条件编译的判断
//	fprintf(stdout, "Hello World");
//#else//跟条件语句中的else作用同理
//	fprintf(stdout, "兔子\n");
//#endif//终止#if的判断指令，在#endif后的语句仍可执行
//	fprintf(stdout, "%d", 5);
//	return 0;
//}

//条件判断是否定义宏
//#include<stdio.h>
//#define MAX 5
//int main()
//{	
//#if defined(MAX)//如若存在MAX这个宏，则下面的代码执行，否则在预处理时删除以下代码
////其中#if defined(MAX)也可写成#ifdef MAX，两者之间效果一样
//	fprintf(stdout, "%d", MAX);
//#endif
//	return 0;
//}	

//条件判断宏的嵌套使用
//#include<stdio.h>
//int main()
//{
////在多次嵌套的使用在跨平台时的使用较多，在跨平台时会大量的使用宏的嵌套
//#if defined(WIN)
//	#ifdef LIUNX
//		Wliunx();
//	#endif
//	#ifdef UNIX
//		opper();
//	#endif
//#elif defined(OPP)
//	#ifdef NUIO
//		liunx();
//	#endif
//#endif
//	return 0;
//}//在用#if和#endif条件预处理时相当于注释，在预编译过程中判断是否直接将其删除

//宏的模拟实现offsetof
//#include<stdio.h>
//#define MOVE(s,type) (int)(&(((s*)0)->type))
////首先，先将0转成结构体指针，这样地址加1就代表了偏移1位
////然后指向其数据的首地址代表了与刚开始0位置的偏移量
////最后将其转换成int型输出就代表了十进制的偏移量，因为计算机中是以十六进制存储的
//struct S1
//{
//	int a;
//	short t;
//	float b;
//	char c;
//}arr;
//int main()
//{
//	fprintf(stdout, "%d\n", MOVE(struct S1, b));
//	return 0;
//}